\section{Introdução}

Um dos modelos de programação paralela existentes é o modelo de programação em memória partilhada. Neste modelo, os processos/threads comunicam através de um espaço global de endereços, onde este poderá estar mapeado numa mesma máquina de memória partilhada física onde os threads acedem à mesma memória física ou pode ser simulado através de uma camada de software (\emph{middleware}/\emph{runtime}) que oferece um modelo de programação em memória partilhada ao programador sobre arquitecturas de memória distribuída, como um cluster.

O modelo Linda define um modelo de coordenação e comunicação entre vários processos concorrentes onde estes acedem a um espaço de tuplos. O espaço de tuplos é uma colecção de objectos - \textbf{tuplos} - onde os processos concorrentes acedem para inserir e remover tuplos. 
O modelo Linda define 3 primitivas básicas:

\begin{description}
\setlength{\itemsep}{1pt}
  \setlength{\parskip}{0pt}
  \setlength{\parsep}{0pt}
\item[in] Primitiva bloqueante que lê e remove atomicamente um tuplo qualquer que seja compatível com o \emph{template};
\item[out] Primitiva assíncrona que insere um tuplo;
\item[rd] Primitiva bloqueante que lê atomicamente um tuplo qualquer que seja compatível com o \emph{template};
\end{description}

O modelo Linda está instanciado em várias implementações tais como o TSpaces \cite{TSpaces1, TSpaces2} da IBM ou o JavaSpaces \cite{javaspaces} da Oracle/Sun. Existem implementações do espaço de tuplos centralizadas (um único servidor) ou descentralizadas (vários servidores). Cada abordagem tem naturalmente as suas vantagens e desvantagens.
Para teste trabalho foi utilizado o TSpaces que é uma biblioteca em JAVA para o desenvolvimento de aplicações que utilizem um espaço de tuplos. Esta implementação utiliza um servidor centralizado.

O objectivo deste trabalho era a implementação de várias aplicações utilizando um espaço de tuplos, recorrendo à linguagem Java e à biblioteca TSpaces.
Na primeira parte do trabalho, o objectivo era ter uma implementação de um semáforo, uma implementação de uma barreira e uma implementação de um \emph{stream}.
Na segunda parte do trabalho, o objectivo era implementar um problema clássico de map-reduce \cite{map-reduce} - \emph{wordCount}. A aplicação \emph{wordCount} conta o número de ocorrências de cada palavra num texto. A solução passou por mapear a computação que utiliza um modelo de paralelismo de dados num padrão de master/slave, onde o master parte o texto num número determinado de partições e os slaves têm a função de computar cada tarefa/partição.